<?php

use Illuminate\Support\Facades\Storage;

function file_local_path($file)
{
    return storage_path('app' . DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR) . $file;
}

function file_local_private_path($file)
{
    return storage_path('app' . DIRECTORY_SEPARATOR . 'private' . DIRECTORY_SEPARATOR) . $file;
}

function file_host_path($file)
{
    return config('app.url') . Storage::url($file);
}

function route_name($route_name)
{
    return str_replace(".", '-', $route_name);
}
function year_start($year) {
    return $year . '-1-1 00:00:00';
}

function year_end($year) {
    return $year . '-12-31 23:59:59';
}

function date_start($date) {
    return $date . ' 00:00:00';
}

function date_end($date) {
    return $date . ' 23:59:59';
}

function randomIntString($length = 4)
{
    $pattern = '123456789';
    $key = '';
    for ($i = 0; $i < $length; $i++) {
        $key .= $pattern[mt_rand(0, 8)];    //生成php随机数mt_rand 速度是rand的10倍
    }
    return $key;
}

function floatToPercent($number)
{
    return floor(floatval($number) * 100);
}

function displayFloat($number, $is_must_digits = false)
{
    if ($is_must_digits) {
        return $number;
    }
    return floatval($number) + 0;
}
/**
* 对手机号进行掩码处理
* 手机号掩码的规则是末尾4位，开头余数位不变，中间4的整数倍字符用星号替换
* @param string $mobile 手机号
* @return string
*/
function formatMobile($mobile){
    if (!$mobile || strlen($mobile) < 11) {
        return $mobile;
    }
    //颠倒顺序每隔4位分割为数组
    $split = str_split(strrev($mobile),4);
    //头和尾保留，其他部分替换为星号
    $split = array_fill(1,count($split) - 2,"****") + $split;
    ksort($split);
    //合并颠倒顺序
    return strrev( implode("",$split));
}

/**
* 对身份证进行掩码
* 掩码规则是显示头两位和末尾1位，中间星号
* @param string $id_card 身份证号
* @return string
*/
function formatIdCard($id_card){
    if (!$id_card || strlen($id_card) < 18) {
        return $id_card;
    }
    //每隔1位分割为数组
    $split = str_split($id_card,1);
    //头2位和尾保留，其他部分替换为星号
    $split = array_fill(2,count($split) - 3,"*") + $split;
    ksort($split);
    //合并
    return implode("",$split);
}

/**
 * 身份证校验
 * @param $id string 身份证号码
 * @return bool
 */
function is_idcard($id) {
    $id        = strtoupper($id);
    $regx      = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
    $arr_split = array();
    if (!preg_match($regx, $id)) {
        return false;
    }
    if (15 == strlen($id)) //检查15位
    {
        $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";

        @preg_match($regx, $id, $arr_split);
        //检查生日日期是否正确
        $dtm_birth = "19" . $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
        if (!strtotime($dtm_birth)) {
            return false;
        } else {
            return true;
        }
    } else //检查18位
    {
        $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
        @preg_match($regx, $id, $arr_split);
        $dtm_birth = $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
        if (!strtotime($dtm_birth)) //检查生日日期是否正确
        {
            return false;
        } else {
            //检验18位身份证的校验码是否正确。
            //校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
            $arr_int = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
            $arr_ch  = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
            $sign    = 0;
            for ($i = 0; $i < 17; $i++) {
                $b = (int) $id{$i};
                $w = $arr_int[$i];
                $sign += $b * $w;
            }
            $n       = $sign % 11;
            $val_num = $arr_ch[$n];
            if ($val_num != substr($id, 17, 1)) {
                return false;
            } //phpfensi.com
            else {
                return true;
            }
        }
    }
}

/**
 * 根据数字获取excel中的列字母
 *
 * @param integer $num
 */
function int2ExcelLetter($num)
{
    $m = intval($num % 26);
    $q = intval($num / 26);
    $letter = chr(ord('A') + $m);

    if ($q > 0) {
        return int2ExcelLetter($q - 1) .  $letter;
    }
    return $letter;
}

function int3ExcelLetter($num)
{
    if ($num == 0) {
        return 'A';
    }
    if ($num > 26) {
        $count = floor($num / 26);
        $count2 = $num % 26;
        $a = int3ExcelLetter($count - 1);
        $b = int2ExcelLetter($count2);
        return $a . $b;
    } else {
        return int2ExcelLetter($num);
    }
}

function trim_space($str, $trims = array(" ", "\t", "\n", "\r", "\o", "\xoB"," "))
{
    if (!$str) {
        return $str;
    }
    $replaces = [];
    for ($i = 0; $i < count($trims); $i++) {
        array_push($replaces, '');
    }
    return str_replace($trims, $replaces, trim($str));
}

function controllerIndexStyle($grid_action_width = 150)
{
    $width = $grid_action_width . 'px';
    return <<<CSS
        .content-header {display: none;}
        .grid__actions__ {
            width: {$width};
        }
    CSS;
}
function controllerFormStyle()
{
    return <<<CSS
        .box-header {display: none;}
    CSS;
}

function getIp(){
    if (isset($_SERVER['HTTP_X_REAL_IP']) && $_SERVER['HTTP_X_REAL_IP']) { //nginx 代理模式下，获取客户端真实IP
        $ip = $_SERVER['HTTP_X_REAL_IP'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { //客户端的ip
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }else{
        $ip = $_SERVER['REMOTE_ADDR'];
    }

    return $ip;
}

function dateToHan($date)
{
    if (!$date) {
        return '';
    }
    return date("Y年m月d日", strtotime($date));
}

function dateToHanOnlyMonth($date)
{
    if (!$date) {
        return '';
    }
    return date("n月j日", strtotime($date));
}

function dateToWeek($date)
{
    if (!$date) {
        return '';
    }
    $weekarray=array("日","一","二","三","四","五","六");
    return "周".$weekarray[date("w",strtotime($date))];
}
/**
 * 求两个日期之间相差的天数
 * (针对1970年1月1日之后，求之前可以采用泰勒公式)
 * @param string $date1
 * @param string $date2
 */
function diff_days($date1, $date2){
    if (!$date1 || !$date2) {
        return 0;
    }
    if($date1>$date2){
        $startTime = strtotime($date1);
        $endTime = strtotime($date2);
    }else{
        $startTime = strtotime($date2);
        $endTime = strtotime($date1);
    }
    $diff = $startTime-$endTime;
    $day = $diff/86400;
    return intval($day) + 1;
}

function isWeixin()
{
    if (isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
        return true;
    } else {
        return false;
    }
}
function isMobile()
{
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
        return true;
    }
    // 如果via信息含有wap则一定是移动设备
    if (isset($_SERVER['HTTP_VIA'])) {
        // 找不到为flase,否则为true
        return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    }
    // 脑残法，判断手机发送的客户端标志,兼容性有待提高
    if (isset($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array(
            'nokia',
            'sony',
            'ericsson',
            'mot',
            'samsung',
            'htc',
            'sgh',
            'lg',
            'sharp',
            'sie-',
            'philips',
            'panasonic',
            'alcatel',
            'lenovo',
            'iphone',
            'ipod',
            'blackberry',
            'meizu',
            'android',
            'netfront',
            'symbian',
            'ucweb',
            'windowsce',
            'palm',
            'operamini',
            'operamobi',
            'openwave',
            'nexusone',
            'cldc',
            'midp',
            'wap',
            'mobile'
        );
        // 从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))) {
            return true;
        }
    }
    // 协议法，因为有可能不准确，放到最后判断
    if (isset($_SERVER['HTTP_ACCEPT'])) {
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }
    return false;
}
function getDateByTextForShow($datetext) {
    if (!$datetext) {
        return $datetext;
    }
    if (strlen($datetext) !== 8) {
        return $datetext;
    }
    $year = substr($datetext, 0, 4);
    $month = intval(substr($datetext, 4, 2));
    $day = intval(substr($datetext, 6,2));
    if (!checkdate($month, $day, $year)) {
        return $datetext;
    }
    return date("Y-m-d", strtotime("{$year}-{$month}-{$day}"));
}
function getDateByText($datetext) {
    if (!$datetext) {
        return $datetext;
    }
    if (strlen($datetext) !== 8) {
        return $datetext;
    }
    $year = substr($datetext, 0, 4);
    $month = intval(substr($datetext, 4, 2));
    $day = intval(substr($datetext, 6,2));
    if (!checkdate($month, $day, $year)) {
        return $datetext;
    }
    return "{$year}-{$month}-{$day}";
}
/**
 * 判断是否是有效的时间
 */
function isValidDate($datetext) {
    if (!$datetext) {
        return false;
    }
    if (strlen($datetext) !== 8) {
        return false;
    }
    $year = substr($datetext, 0, 4);
    $month = intval(substr($datetext, 4, 2));
    $day = intval(substr($datetext, 6,2));
    if (!checkdate($month, $day, $year)) {
        return false;
    }
    return true;
}

function getBirthdayByIdCard($id_card)
{
    return strlen($id_card)==15 ? ('19' . substr($id_card , 6, 6) ) :substr($id_card, 6, 8);
}

function dy_base_gzgw() {
    return ['科研岗','管理岗','支撑岗','博士后','企业岗位','工勤技能','本科生','硕士生','博士生','离退休','保留党籍','毕业挂靠'];
}
function dy_sex() {
    return ['男', '女'];
}
function dy_rylb() {
    return ['正式党员', '预备党员'];
}
function dy_xl() {
    return ['博士研究生','硕士研究生','大学本科','大学专科及以下'];
}
function dy_xw() {
    return ['博士','硕士','学士','无学位'];
}
function dy_qc_gzgw() {
    return ['教工', '学生'];
}
function dy_gzgw_fz() {
    return ["科研岗","管理岗","支撑岗","博士后","本科生","硕士生","博士生"];
}
function dy_gzgw2() {
    return ['教职工', '本科生', '硕士生', '博士生'];
}
function dy_zblx() {
    return ["学生党支部","教职工党支部","师生联合党支部","离退休党支部"];
}
function dy_mz() {
    return ["汉族","少数民族"];
}
# 公派出国（境）半年以上
function dy_gpcc()
{
    return ["驻外机构","劳务输出","公派留学一年以内","公派留学且逾期一年以上未归的","其他"];
}
# 因私出国(境)半年以上
function dy_yscc()
{
    return ["自费留学","工作","其他"];
}
# 本年自费留学出国
function dy_bnzfcg()
{
    return ["是","否"];
}
# 本年出国（境）定居
function dy_bnzfcgdj()
{
    return ["探亲","继承遗产","工作","其他"];
}

function yjdzz()
{
    return [
        "少年班学院党总支",
        "数学科学学院党委",
        "物理学院党委",
        "化学与材料科学学院党委",
        "工程科学学院党委",
        "信息科学技术学院党委",
        "计算机科学与技术学院党委",
        "大数据学院党总支",
        "网络空间安全学院党总支",
        "微电子学院党总支",
        "软件学院党委",
        "地球和空间科学学院党委",
        "生命科学与医学部党委",
        "附属第一医院党委",
        "管理学院党委",
        "公共事务学院党委",
        "人文与社会科学学院党委",
        "马克思主义学院党总支",
        "环境科学与工程系党总支",
        "苏州高等研究院党委",
        "上海研究院党委",
        "先进技术研究院党委",
        "人工智能研究院党委",
        "国家同步辐射实验室党委（核科学技术学院党委）",
        "合肥微尺度物质科学国家研究中心党委",
        "火灾科学国家重点实验室党委",
        "本科生院直属党支部",
        "机关党委",
        "离退休干部党委",
        "图书网络档案联合党总支",
        "出版社党总支",
        "医院直属党支部",
        "资产经营有限责任公司直属党支部",
        "基础教育集团党委 ",
        "饮食服务集团直属党支部",
    ];
}

function dws()
{
    return [
        "DDB001" => "少年班学院党总支",
        "DDB002" => "数学科学学院党委",
        "DDB003" => "物理学院党委",
        "DDB004" => "化学与材料科学学院党委",
        "DDB005" => "工程科学学院党委",
        "DDB006" => "信息与智能学部党工委",
        "DDB007" => "地球和空间科学学院党委",
        "DDB008" => "生命科学与医学部党委（含大健康研究院）",
        "DDB009" => "管理学院党委",
        "DDB010" => "公共事务学院党委",
        "DDB011" => "人文与社会科学学院党委",
        "DDB012" => "马克思主义学院党总支",
        "DDB013" => "环境科学与工程系党总支",
        "DDB014" => "国家同步辐射实验室党委（核科学技术学院党委）",
        "DDB015" => "合肥微尺度物质科学国家研究中心党委",
        "DDB016" => "火灾科学国家重点实验室党委",
        "DDB017" => "苏州高等研究院党委",
        "DDB018" => "上海研究院党委",
        "DDB019" => "先进技术研究院党委",
        "DDB020" => "附属第一医院党委",
        "DDB021" => "机关党委",
        "DDB022" => "离退休干部党委",
        "DDB023" => "本科生院直属党支部",
        "DDB024" => "图书网络档案联合党总支",
        "DDB025" => "出版社党总支",
        "DDB026" => "医院直属党支部",
        "DDB027" => "资产经营有限责任公司直属党支部",
        "DDB028" => "基础教育集团党委",
        "DDB029" => "饮食服务集团直属党支部",
    ];
}

function dzzs()
{
    return [
        '000' => '少年班学院党总支',
        '001' => '数学科学学院党委',
        '203' => '物理学院党委',
        '206' => '化学与材料科学学院党委',
        '209' => '工程科学学院党委',
        '210' => '信息科学技术学院党委',
        '215' => '计算机科学与技术学院党委',
        '229' => '大数据学院党总支',
        '221' => '网络空间安全学院党总支',
        '219' => '微电子学院党总支',
        '225' => '软件学院党委',
        '208' => '地球和空间科学学院党委',
        '910' => '生命科学与医学部党委',
        '911' => '附属第一医院党委',
        '204' => '管理学院党委',
        '216' => '公共事务学院党委',
        '211' => '人文与社会科学学院党委',
        '220' => '马克思主义学院党总支',
        '240' => '环境科学与工程系党总支',
        '226' => '苏州高等研究院党委',
        '228' => '上海研究院党委',
        '218' => '先进技术研究院党委',
        'TMP387' => '人工智能研究院党委',
        '231' => '国家同步辐射实验室党委（核科学技术学院党委）',
        '234' => '合肥微尺度物质科学国家研究中心党委',
        '232' => '火灾科学国家重点实验室党委',
        '200' => '本科生院直属党支部',
        '501' => '机关党委',
        '511' => '离退休干部党委',
        '302' => '图书网络档案联合党总支',
        '303' => '出版社党总支',
        '803' => '医院直属党支部',
        '901' => '资产经营有限责任公司直属党支部',
        'TMP003' => '基础教育集团党委 ',
        '701' => '饮食服务集团直属党支部',

    ];
}

#高级职称
function gj_zc(){
    return [
        '教授',
        '正高级讲师',
        '正高级实习指导教师',
        '正高级教师',
        '研究员',
        '正高级工程师',
        '正高级实验师',
        '教授级高级农艺师',
        '教授级高级兽医师',
        '教授级高级畜牧师',
        '主任医师',
        '主任药师',
        '主任护师',
        '主任技师',
        '正高级经济师',
        '正高级知识产权师',
        '正高级会计师',
        '正高级审计师',
        '正高级统计师',
        '高级记者',
        '高级编辑',
        '编审',
        '研究馆员',
        '特任教授',
        '特任研究员',
    ];
}

#副高职称
function fg_zc(){
    return [
        '副教授',
        '高级讲师',
        '高级实习指导教师',
        '高级教师',
        '副研究员',
        '高级工程师',
        '高级实验师',
        '高级农艺师',
        '高级兽医师',
        '高级畜牧师',
        '副主任医师',
        '副主任药师',
        '副主任护师',
        '副主任技师',
        '高级经济师',
        '高级知识产权师',
        '高级会计师',
        '高级审计师',
        '高级统计师',
        '主任记者',
        '主任编辑',
        '副编审',
        '副研究馆员',
        '特任副教授',
        '特任副研究员',
    ];
}

#中级职称
function zj_zc(){
    return [
        '讲师',
        '一级实习指导教师',
        '一级教师',
        '助理研究员',
        '工程师',
        '实验师',
        '农艺师',
        '兽医师',
        '畜牧师',
        '主治医师',
        '主管药师',
        '主管护师',
        '主管技师',
        '经济师',
        '知识产权师',
        '中级会计师',
        '审计师',
        '统计师',
        '记者',
        '编辑',
        '馆员',
        '小学高级教师',
    ];
}

function dy_zc(){
    $arr = [
        '一级职员',
        '二级职员',
        '三级职员',
        '四级职员',
        '五级职员',
        '六级职员',
        '七级职员',
        '八级职员',
        '九级职员',
        '高级工',
    ];

    return array_merge(gj_zc(), fg_zc(),zj_zc(), $arr);
}

function dy_zcjb()
{
    return [
        '高级职称',
        '副高职称',
        '中级职称',
        '其它',
    ];
}

function must_valid_errors(){
    return [
        '迁出党员不能全体党员名册内',
        '职称不在规定的填写范围内',
        '新发展党员必须全体党员名册或迁出党员名册内',
        '转为正式党员时间必须符合连续8位数的要求',
        '加入党组织时间必须符合连续8位数的要求',
        '转为正式党员时间必须在加入党组织时间之后',
        '姓名必须填写',
        '预备党员不应该有转为正式党员时间',
        '身份证号码必须填写',
        '身份证号码无效',
        '党支部名称必须填写',
        '院级党组织名称必须填写',
        '年龄必须填写',
        '发展对象不能在全体党员名册内',
        '入党积极分子不能在全体党员名册内',
        '迁出党员不能在全体党员名册内',
        '迁入党员不在全体党员名册内',
        '迁入党员必须在全体党员或迁出党员名册内',
        '院级党组织所属党总支名称必须填写',
    ];
}

/** 
* 加密 
* @param string $string     要加密或解密的字符串 
* @param string $operation 加密 ''  解密 DECODE 
* @param string $key        密钥，加密解密时保持一致 
* @param int    $expiry 有效时长，单位：秒 
* @return string 
*/  
function encrypt_code($string, $expiry = 0, $key = 'zzb12') {  
    $ckey_length = 1;  
    $key = md5($key); //加密解密时这个是不变的  
    $keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的  
    $keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的  
    $keyc = $ckey_length ?  substr(md5(microtime()), -$ckey_length) : '';  
    $cryptkey = $keya . md5($keya . $keyc); //64  
    $key_length = strlen($cryptkey); //64  
   
    $string =sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;  
    $string_length = strlen($string);  
   
    $result = '';  
    $box = range(0, 255);  
   
    $rndkey = array();  
    for ($i = 0; $i <= 255; $i++) { //字母表 64位后重复 数列 范围为48~122  
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);  
    }  
   
    for ($j = $i = 0; $i < 256; $i++) { //这里是一个打乱算法  
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;  
        $tmp = $box[$i];  
        $box[$i] = $box[$j];  
        $box[$j] = $tmp;  
    }  
    for ($a = $j = $i = 0; $i < $string_length; $i++) {  
        $result .= chr(ord($string[$i]) ^ ($box[$i]));  
       
    }  
     $str =  $keyc . str_replace('=', '', base64_encode($result));    
                //  $str =htmlentities($str, ENT_QUOTES, "UTF-8"); // curl 访问出错  
                  return $str ;  
}  
  
               
/** 
* 解密 
* @param string $string     要加密或解密的字符串 
* @param string $operation 加密 ''  解密 DECODE 
* @param string $key        密钥，加密解密时保持一致 
* @param int    $expiry 有效时长，单位：秒 
* @return string 
*/  
function encrypt_decode($string, $expiry = 0,$key = 'zzb12') {    
    $ckey_length = 1;  
    $key = md5($key); //加密解密时这个是不变的  
    $keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的  
    $keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的  
                
    $keyc = $ckey_length ?  substr($string, 0, $ckey_length)   : '';  
  
    $cryptkey = $keya . md5($keya . $keyc); //64  
    $key_length = strlen($cryptkey); //64  
    $string = base64_decode(substr($string, $ckey_length)) ;  
               $string_length = strlen($string);  
    $result = '';  
    $box = range(0, 255);  
  
    $rndkey = array();  
    for ($i = 0; $i <= 255; $i++) { //字母表 64位后重复 数列 范围为48~122  
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);  
    }  
    for ($j = $i = 0; $i < 256; $i++) { //这里是一个打乱算法  
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;  
  
        $tmp = $box[$i];  
        $box[$i] = $box[$j];  
        $box[$j] = $tmp;  
    }  
    for($a = $j = $i = 0; $i < $string_length; $i++) {  
        $result .= chr(ord($string[$i]) ^ ($box[$i]));  
    }  
    if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {  
       return substr($result, 26);  
    }else{  
       return false;  
    }  
}

function randomkeys($length)
{
    $pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ';
    $key = '';
    for ($i = 0; $i < $length; $i++) {
        $key .= $pattern{
        mt_rand(0, 35)};    //生成php随机数
    }
    return $key;
}

function get_basename($filename){    
    return preg_replace('/^.+[\\\\\\/]/', '', $filename);    
}